/**
 * @(#) SimpleThreads.java May 30, 2010 11:54:19 AM
 * Copyright (C) 2009 GeeYee Inc. 60606, Chicago, IL, USA
 * All right reserved
 */
package old;

/**
 * Class <code>SimpleThreads</code>
 * 
 * @author Xiaowen dingxwsimon@gmail.com
 * @since May 30, 2010 11:54:19 AM
 * 
 */
public class SimpleThreads
{

	// Display a message, preceded by the name of the current thread
	static void threadMessage(String message)
	{
		String threadName = Thread.currentThread().getName();
		System.out.format("%s: %s%n", threadName, message);
	}

	private static class MessageLoop implements Runnable
	{
		public void run()
		{
			String importantInfo[] =
			{ "Mares eat oats", "Does eat oats", "Little lambs eat ivy",
					"A kid will eat ivy too" };
			try
			{
				for (int i = 0; i < importantInfo.length; i++)
				{
					// Pause for 4 seconds
					Thread.sleep(4000);
					// Print a message
					threadMessage(importantInfo[i]);
				}
			} catch (InterruptedException e)
			{
				threadMessage("I wasn't done!");
			}
		}
	}

	public static void main(String args[]) throws InterruptedException
	{

		// Delay, in milliseconds before we interrupt MessageLoop
		// thread (default one hour).
		long patience = 1000 * 60 * 60;

		// If command line argument present, gives patience in seconds.
		/*if (args.length > 0)
		{
			try
			{
				patience = Long.parseLong(args[0]) * 1000;
			} catch (NumberFormatException e)
			{
				System.err.println("Argument must be an integer.");
				System.exit(1);
			}

		}*/
		
		patience = 2 * 1000;

		threadMessage("Starting MessageLoop thread");
		long startTime = System.currentTimeMillis();
		Thread t = new Thread(new MessageLoop());
		t.start();

		threadMessage("Waiting for MessageLoop thread to finish");
		// loop until MessageLoop thread exits
		while (t.isAlive())
		{
			threadMessage("Still waiting...");
			// Wait maximum of 1 second for MessageLoop thread to
			// finish.
			t.join(5000);
			if (((System.currentTimeMillis() - startTime) > patience)
					&& t.isAlive())
			{
				threadMessage("Tired of waiting!");
				t.interrupt();
				// Shouldn't be long now -- wait indefinitely
				t.join();
			}

		}
		threadMessage("Finally!");
	}

}
